Guía Maestra: Generador de Planes Académicos IA

1. Visión General del Proyecto

El objetivo es construir una herramienta web dedicada y avanzada que utilice un modelo de IA para generar planes académicos detallados (charlas) de 2.5 horas de duración para los subtemas de un curso. La herramienta debe ser contextual, utilizando no solo una instrucción directa del usuario, sino también información estructural del curso (nombres, descripciones, objetivos) para producir resultados de alta calidad. El sistema debe ser robusto, seguro y ofrecer una experiencia de usuario clara y controlada.

2. Arquitectura de la Solución

La solución se desacopla de la vista principal del curso para existir como una herramienta independiente, mejorando la mantenibilidad y permitiendo una interfaz más rica. Los componentes son:

3. Requisitos de Base de Datos

Este es el prerrequisito fundamental. La tabla subtemas_curso debe ser modificada para almacenar la nueva información.

Acción Obligatoria: Un desarrollador debe ejecutar las siguientes sentencias SQL en la base de datos antes de proceder con cualquier desarrollo de código. La ausencia de estos campos causará fallos en el sistema.
ALTER TABLE `subtemas_curso`
ADD COLUMN `prompt` TEXT NULL DEFAULT NULL COMMENT 'Instrucción específica del usuario para la IA' AFTER `valor_hora`,
ADD COLUMN `charla` LONGTEXT NULL DEFAULT NULL COMMENT 'Plan de charla generado por la IA' AFTER `prompt`,
ADD COLUMN `token_count` INT(11) NULL DEFAULT 0 COMMENT 'Contador de palabras/tokens del prompt' AFTER `charla`;

4. Diseño de Interfaz y Experiencia de Usuario (UI/UX)

La nueva página generador_plan_academico.php será la interfaz principal. Recibirá un `id` de subtema por URL (ej. ?id=123) y se estructurará de la siguiente manera:

Encabezado de Contexto

Una sección superior no editable que muestra la jerarquía para que el usuario siempre esté ubicado:

Curso: [Nombre del Curso Obtenido de la BD]
Tema: [Nombre del Tema Padre Obtenido de la BD]
Subtema: [Nombre del Subtema Actual Obtenido de la BD]

Panel de Control del Prompt

Un área de dos columnas que permite al usuario construir la instrucción perfecta para la IA.

Prompt Sugerido por el Sistema

Un <textarea> editable que se rellena al cargar la página con todo el contexto concatenado (descripciones, objetivos, etc.). El usuario puede refinar esta sugerencia.

Contador: Debajo, un contador de palabras se actualizará en tiempo real: <span id="word_count">0</span> palabras (tokens aprox.).

Prompt Final (Para Guardar)

Un <textarea> que muestra el `prompt` actualmente guardado en la base de datos. El usuario puede copiar la sugerencia de la izquierda aquí, o escribir una desde cero.

Botón "Guardar Prompt": Al hacer clic, se guardará el contenido de este `textarea` en la base de datos. Si el campo ya tenía contenido, un `confirm()` de JavaScript preguntará: "¿Desea sobrescribir el prompt existente?".

Panel de Generación

Un botón central "Generar Plan de Charla con el Prompt Guardado". Este botón estará deshabilitado hasta que se guarde un `prompt` en la columna derecha, asegurando que solo se use una instrucción definitiva.

Panel de Resultado

Un <textarea> grande, de solo lectura, que mostrará el plan de charla generado por la IA. Al cargar la página, mostrará el contenido del campo charla si ya existe. Contará con un botón "Guardar Plan Definitivo" para persistir el resultado en la base de datos.

5. Flujo Lógico de Datos y Backend

El flujo de datos está diseñado para ser seguro y lógico, separando la lectura, la generación y la escritura.

  1. Carga de Página (`generador_plan_academico.php`): Al cargar, el script PHP ejecuta una consulta SQL compleja con `JOIN`s para obtener todos los datos de contexto (nombres de curso/tema/subtema, y los contenidos de los campos `prompt`, `charla`, descripciones, objetivos, etc.) y los muestra en la interfaz.
  2. Generación del Plan (`avi/chat_charla_ia.php`): Al presionar "Generar Plan", el JavaScript solo envía el `subtema_id` a este script. El backend vuelve a consultar la BD para obtener el `prompt` guardado y todo el contexto, construye el `prompt` final para la IA, lo envía a Google y devuelve únicamente el texto del plan generado.
  3. Guardado del Plan (`ajax_guardar_plan.php`): Al presionar "Guardar Plan Definitivo", el JavaScript envía el `subtema_id` y el contenido del `textarea` a este script, cuya única función es ejecutar una sentencia `UPDATE` segura para guardar los datos en el campo `charla`.
Consejo de Desarrollo: Usar scripts pequeños y dedicados para las acciones de guardado (microservicios) es una práctica excelente que mejora la seguridad y la claridad del código.

6. Flujo de Uso por el Usuario

Desde la perspectiva del usuario, el proceso es intuitivo y le otorga control total.

  1. El usuario navega a ver_curso_o_ppp_ia.php y hace clic en el nuevo botón "Generar Plan" de un subtema.
  2. Es redirigido a generador_plan_academico.php, donde ve toda la información de contexto.
  3. Revisa el "Prompt Sugerido", lo edita si es necesario, y lo pasa al panel de "Prompt Final".
  4. Hace clic en "Guardar Prompt". El sistema le advierte si está sobrescribiendo.
  5. El botón "Generar Plan de Charla" se habilita. El usuario hace clic. Un indicador de carga aparece.
  6. El resultado de la IA aparece en el panel "Plan de Charla Generado".
  7. El usuario puede editar el plan manualmente si lo desea.
  8. Finalmente, hace clic en "Guardar Plan Definitivo" para almacenar el resultado final.

7. Consideraciones Finales y Buenas Prácticas

Seguridad: Todas las operaciones de escritura en la base de datos (`UPDATE`, `INSERT`) deben usar **sentencias preparadas** (prepared statements) para prevenir inyecciones SQL.
Gestión de la API Key: La clave de la API de Google debe permanecer siempre en el lado del servidor (archivos PHP) y nunca ser expuesta en el código JavaScript del lado del cliente. Debe ser tratada como una contraseña.
Experiencia de Usuario: Es fundamental proporcionar retroalimentación visual al usuario durante las operaciones que toman tiempo (como la llamada a la IA). Mostrar y ocultar indicadores de carga (spinners) en los botones es una práctica excelente.